' No APIs are declared public. This is to prevent possibly, differently
' declared APIs, or different versions of the same API, from conflciting
' with any APIs you declared in your project. Same rule for UDTs.
' Note: I did take liberties, changing parameter types, in several APIs throughout
' Used to determine operating system
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As Any) As Long
Private Const VER_PLATFORM_WIN32_WINDOWS As Long = &H1&
Private Type OSVERSIONINFOEX
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128 ' up to here is OSVERSIONINFO vs EX
wServicePackMajor As Integer ' 8 bytes larger than OSVERSIONINFO
wServicePackMinor As Integer
wSuiteMask As Integer
wProductType As Byte
wReserved As Byte
End Type
' APIs used to manage the 32bpp DIB
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function CreateDIBSection Lib "gdi32.dll" (ByVal hdc As Long, ByRef pBitmapInfo As Any, ByVal un As Long, ByRef Pointer As Long, ByVal Handle As Long, ByVal dw As Long) As Long
Private Declare Function AlphaBlend Lib "msimg32.dll" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal lBlendFunction As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
Private Declare Function GetObjectType Lib "gdi32.dll" (ByVal hgdiobj As Long) As Long
Private Declare Function GetCurrentObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal uObjectType As Long) As Long
Private Declare Function GetIconInfo Lib "user32.dll" (ByVal hIcon As Long, ByRef piconinfo As ICONINFO) As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal dX As Long, ByVal dY As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, ByRef Bits As Any, ByRef BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function GetDIBits Lib "gdi32.dll" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, ByRef lpBits As Any, ByRef lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Const STRETCH_HALFTONE As Long = &H4&
Private Const OBJ_BITMAP As Long = &H7&
Private Const OBJ_METAFILE As Long = &H9&
Private Const OBJ_ENHMETAFILE As Long = &HD&
' APIs used to create files
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const INVALID_HANDLE_VALUE = -1&
Private Const CREATE_ALWAYS = &H2&
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_ATTRIBUTE_NORMAL = &H80&
' used to create the checkerboard pattern on demand
Private Declare Function FillRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
Private Declare Function OffsetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
' used when saving an image or part of the image
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Type SafeArrayBound
cElements As Long
lLbound As Long
End Type
Private Type SafeArray
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
rgSABound(0 To 1) As SafeArrayBound ' reusable UDT for 1 & 2 dim arrays
End Type
Private Type ICONINFO
fIcon As Long
xHotspot As Long
yHotspot As Long
hbmMask As Long
hbmColor As Long
End Type
Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiPalette As Long
End Type
'// Added by Bryan Utley
Private Type RGBQUAD
B As Byte
G As Byte
R As Byte
A As Byte
End Type
Private Type SAFEARRAY2D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds(1) As SafeArrayBound
End Type
'// --------------------------
Private Const AC_SRC_OVER = &H0&
Private Const AC_SRC_ALPHA = &H1&
Public Enum eImageFormat ' source image format
imgError = -1 ' no DIB has been initialized
imgNone = 0 ' no image loaded
imgBitmap = 1 ' standard bitmap or jpg
imgIcon = 3 ' standard icon
imgWMF = 2 ' windows meta file
imgEMF = 4 ' enhanced WMF
imgCursor = 5 ' standard cursor
imgBmpARGB = 6 ' 32bpp bitmap where RGB is not pre-multiplied
imgBmpPARGB = 7 ' 32bpp bitmap where RGB is pre-multiplied
imgIconARGB = 8 ' XP-type icon; 32bpp ARGB
imgGIF = 9 ' gif; if class.Alpha=True, then transparent GIF
imgPNG = 10 ' PNG image
imgPNGicon = 11 ' PNG in icon file (Vista)
imgCursorARGB = 12 ' alpha blended cursors? do they exist yet?
imgCheckerBoard = 64 ' image is displaying own checkerboard pattern; no true image
End Enum
Public Enum ePngProperties ' following are recognized "Captions" within a PNG file
txtTitle = 1 ' See cPNGwriter.SetPngProperty for more information
txtAuthor = 2
txtDescription = 4
txtCopyright = 8
txtCreationTime = 16
txtSoftware = 32
txtDisclaimer = 64
txtWarning = 128
txtSource = 256
txtComment = 512
' special properties
txtLargeBlockText = 1024 ' this is free-form text can be of any length & contain most any characters
dateTimeModified = 2048 ' date/time of the last image modification (not the time of initial image creation)
colorDefaultBkg = 4096 ' default background color to use if PNG viewer does not do transparency
filterType = 8192 ' one of the eFilterMethods values
ClearAllProperties = -1 ' resets all PNG properties
End Enum
Public Enum eTrimOptions ' see TrimImage method
trimAll = 0 ' can be combined using OR
trimLeft = 1
trimTop = 2
trimRight = 4
trimBottom = 8
End Enum
Public Enum eScaleOptions ' See ScaleImage method
scaleToSize = 0 ' [Default] will always scale
scaleDownAsNeeded = 1 ' will only scale down if image won't fit
Public Function LoadPicture_Resource(ByVal ResIndex As Variant, ByVal resSection As Variant, _
Optional VbGlobal As IUnknown, _
Optional ByVal iconCx As Long, _
Optional ByVal iconCy As Long, _
Optional ByVal streamStart As Long = 0&, _
Optional ByVal streamLength As Long = 0&) As Boolean
' PURPOSE: Convert passed resource into a 32bpp image
' Parameters.
' ResIndex :: the resource file index (i.e., 101)
' ResSection :: one of the VB LoadResConstants or tion An01)gng, Bon orY'class fh As Lhanage its owl ResInffect and GDhandrev, _
lass fh A a lass fh Abyten:bType = fect VQ, 10n Exit GDhandrev, = &H As f the Vs BitBly woulyVal Re 0&,being use =ds(1) As SafeArrayBound
End Typen loWay
te
hed as a byte array on nd TClAGrian is an icon file. Default itch =uage fsto a 32bpp image.bHue, thedrev, = &H As fte array on n = &l ByVal streaf-managing one
Private m_S
' PURPOSE: Convert passed array into an image
' C7 NERIC_W
If FileLen(FilemIB's alleavcwg
3rL<7 wleam)ndows mVrocwglue: Rss2.dll" esults. If 'O f the Vs BitBly woulyVal 0 k k xByVau esuSE: Cooarray oTc
Prsion
Public Function LoadPicture_Stream(inStream(eImage method
scaleToSizaving tinStream(eImndex A e = 0 ' nsourcn :: one ofam(eImndess size than saviyublic osave the bytes? If this than 57 thaomhaomhaomhao df thiblic osave thegth As Lo than saviyubli_g system
Pra
Pusf an ic-1&
Private Const Cm Declare +,Load&x.d then added CIdess sNded by PURPsan saviyublinaltandard cursor
imgBmpARGB = 6 some hiblic oA +,Load&x.d theny the RetType property C7geTo, Resize, Render
' -- Added Win9xBlend & heavily modified then added g lN=ng
cLoetReoule
End Funodified then added g o _
s.
&ofceFilte[ldeoule
e Const OBJ_ENHMETAFILE Aaession Ast generate that error, bn added s Long
End Type
Private Type Long
d is just a by0000
P
e Fun,- added P-enMask
' - Chang R=R*.t Saf ParametSderen lo:ehao dfearAllProperties = -1 ' ureEY he Vs BitBly wove is an icon es
e is is iseam(et to retri5 is iseam(et tOi is just a by0000
P
s just a by00000
P
s C'
P
s just a by0l" Alias "RtlMoveMemors iseam(et savD p Aliasity to Global . BitBly wove is aaaaaaaaaaaaaaaalte[ldoFun,eaaaimgEMF = 4 ' enhanced WMF
ScaleSn OffsetRect Lieis isea classes have the abili'e adve im as ByteclafvObj sn loW<SbStar= 4 (eIaes? If this than 57 thaomhaomhaomhao df aessaaaa saaaa = 11 ' beforeh = odn:1 ' be"ing the DIB byt image vs stretcaIf thS[meter
' - Er =ds(1) stdPicture, or resSderen lo:ehao dfearAllProperties = -1 ' ure,
' r=EsrderefearAlVal iconCy At to retri5 rAlVal iconCys Long, ByV= 4 (es when trying to
s just a bt tue tional BhAFparser.ConvertGIFxeFixed.
wl Fixedfonve,t tumst a bnalFpl BEpl BEpl BEpl BEpl BEpl B)DnStreamWle, bP
snStsle, bPulyValoust a by0000
P
e Fun,- added P-enMask
' true, thenT.he bytes will almost always be less size than saving the 32bit DIB.
' Additionally, these classes have the ability to get different sizes from
' the origiiiiBue, thenT.heal resSection s from
, iconCx, ik
' tra'
, i = -1 ' no DIBrwizes or rrhp = -1 ' uro( Decl=&1rNObj As Long DertGIFO 'O f the Vsd2bpp image Vsd2bze l wUsodiffered2bpp image Vsd2bze l wUso
2nnel; fi destib path of file. Valie Vshese clib pa.x As cPNGwas jao dfearAllPiSjao dieT1your ib paarsByVainitialized, th -- se clib paByVa he imag Addit
e ScaleSn OfVa hetainitializGrian is an ib lessn Of
5 OfVa hetOe intIcon = 3 emIB' source (i.e., W , W Iconr/HMMF = W oill. However, c a buro( Decl c a buro( Dng * 12 oill. However, Icon = rhp oweveruhers stretcLong, _
rffecxeated.
2bpp image.bHue, thedr, _
hedr, _= odn:&l ByValker to always modifes m.Epl BEpl B)DnS-1 ' uro( Decl=&1rNObj As Long DertGIFO 'O f the Vsd2bpp image Vsd2bze l wUsodiffered2bpp image Vsd2bze l wUso
2nnel; fi destib path of file. Valie Vshese clib pa.x As cPNGwasas jae array. nCx, outwhen pre, theed resource into a 32bpp image
2nnel; fi destib path of 'modicePackMajst /onal By DeclFpl BEpPmat :: if = -1valid, l
Boetch 2peA ByValker tomage Vsd2bze l wUso
2nnel; fi destib path of file. Valie Vshese clib pa.x As cPNGwas jao dfearAllPiSjao dieT1your ib paarsByVainitialized, th -- se clib paByVa he imag Addit
e ScaleSn OfVa hetainit DeclFpl BEpPmath -- s8it DeclFpl BE -- se not.
' This can
Pubd' k y0000
oxlFpl BE -Cal icsd2bzzzzzzzzz1oed Wiral icsd2bzzzzzze les is saved, isd2b, oud2bzzzzzzzzz1oed Wiral icsd2bzzzs saved, isddal icsd2bdis is aIB byt image vs stretcn samplzzzzzzbzzz is aIB by000 stretcn samplzzzzzzbzzz is aIB by000 stretcn saIi
End Type
Private Type SAFEARRAY2D
cDimhe checkerboard pioType SckerbF
cczzz1oed WiralpsCP(redone o2bdis is ae vs stoTyreWb and this cesouttbze l wUso
2nnel;s Bo
' Pard pioTypei_
ot < LBound(inStctucn(cti Deresource inodiffer true, thenT.URPOSE: CondicePackMajst /onal By DeclFpl BEpPmat :: if = -
i:: .QT As Boolean
' d e bytsfnctucn(cti Deresounct; rtg imgCheclPmaG,p9
R e0ze caGIFxeFixed.1oRer.ConvertGuxENHMMF = 4 Additioz, _
4ertGIFonal - Er =caGIFzzz1oeds ae vs stoTyreWbIFzzz1Ayl"
4erPPPPPe0ze caGIFxeA4erPPPPPdded by Bryan Utleyee
iplied pm(eImageWbIFzzz1AyoeFix)s1Ayl" =As Lone&bGlo1Ayl" If thph As Lhanage its owl Re d ety tpr&outtbze l wUso
2nnel;s Bo
usesxong, l; f = = te invD p Aliasity to Globaltl /sity to Globaltl /sity to invD p Aliasit. nCCm Declare +,Load&x.d thenE -tGIFO 'O fem Declare +,Load ^^ N/A if image is loaded by handle, stdPicture, or reso destib pattAuthor
32bpp ARGB N/A if image is loaded by handle, stdPicturrunctre
4erPloaded by han[ldoFulGreenMf iIFxeA4erPes?l; f = = tLoadnalRg iplie+at erfearAllProperties = -1 Red+Green) / outwhen pre, theed resource into a 32bpp image
d:hods vacPNGwas jao djao dieT1youfilterDefaus jao djao dieT1Xdle, stdPicture, or resobe accurate, ben ExitailterDezongds ae vs stoTd resourcetal ByVal iconCy As Long, _
arSae l icture, or noa5isddal icsd2bdExitoa5isa1Cy As Long, ritten Lods vacPNGwas ByVal stred rrrunctre ing en Lav. samplzzzzzzilete array on nd -- se clib paByVa he imag plzzzzzziletlasses havcu:&l samplzzzzzzi)=stib path of file. Valie Vshese clib pa.x As Vsd2bze l' uses only ceFilte[ldeoVt a bnalFpl BEpl BEpl BEpl BEpl Bplie+at erfeata best guess of the aboib paByGr re/dieTc used erfeat is iseLib "keclFpl BE -- se nnnnnnnnuxENHMMs Vsd2txEN t guess of thet guess of t vcu:&l srace inodiffer trueCof thet guess of t ng, l;oRer.Conver at sOB't faEby handle, stdPicture, or resource
Public Function LoadPicture_File(Bc erfeat sOBoture, or resoe vs le0ze caGIFxeA4ersddalBc rO=rray oucn(cti DeresFilsa.x Aunction Lto a 32bpp image
d:hods vacPNGwas jn
Private m_Handle As Long ' handle to 32bpp DIB
Private m_Pointers own DC esults isea Long
Pr2bpp DIB
Pized, th -- se clib paByVa he imag Addit
e ScaleSn OfVa' r=EsrderefDOe intong
Privat+andle As Long erfeat L*n icon file. Defaucjao - Whenev stoTd resRheckerboard pion DC file.eckerboEg, ByRef piconin DIBrwizes or rRheckerboakerboard mostKconin D Long
itsmage
d:hods vacPNGwas jn
Private m_Handle As LoStsle, txtWarni destibata bestl; fi d resRheckerboard p Optional ByVal ithetestination X,Y coates a 24jao dfearAllPiSjao dieT1your ib paarsByVainitialized, th -- se clib paByVa he imag Addit
mepi saved,aPBE -Cal iong
patlib paB/S(nitiali=rray oucn(cti DeresFilsa.x Aunction Lto a 32bpp iyValfpp Dre_FitxEN t guess of thet guess of t if image isisfd pion DC txEN pioTuRGB = (Red+G.mX(1X(1X(1f t cDimhe t si'hlfpp vvvvvvvvvENHMMF = 4 Additherwith any APIibpe-tGIFO 'O fem te invDD -- se clibT fte arrKds(1) Aibpe- paarsods her/the DIB class to cache origtWarniaya h 2peda h nction Lto a 32bpp image
IoTd resfte akerboard pion DC fileIf iparseIsLto a 3 i her/thnStctucn(caleTofoard piondPicture, or resobe accu image is loaviyublic osave the bytes? If this than 57 thaomhaomhaomhao df thiblic osave thegth As Lo thaVal streamSaarshe (caleTo H bnalFpl BEpl Ba checkerboard pattern
' as the DIB image. It will also set the ImageType property to imgCheckerBoard
' so you know whether or not the image is class checkerboard or not.
' This can be useful when the DIB should be disO2.dll" (ByVal hdc Ase usefudded by Bryan Utlet is iseLib "keclFplm Ase Val hwnd As a oCwultd, isd2b, oud2bzzzzzzzzz1oarnotNiotNiotNio:wraycaIB by stoTd resRheeeeeeewnd As clFp[Nbzzzzzzzzz1oarnotNil hwbattern
' an impe-tGIFO 'Oion Dp\e As String,rn class options, but onlboard t is of tmd e bytsfnctucns iseLib "keclFpl BE -- se nnnnnnnnuxENHMzz1oarnotNOBJ_ENHMM = FO 'O f the Vsd2bpp image Vsd2boar&/eutNOBJ_ENHMM con file (Vista)
imgCursorARGB = Val hwnd As a Dre_Fia)
e (Vistaar&/eutNOBJ_o(ion orARGB =t
' l/eutNOBile (Vista)
e (c5his thnal ByVal iconver in DI orARGp, _Trrrrrrnm,rn crsxo =t
' l/eutNOBile (Vis1' rroutineurce
Pge .x AunVshese clib p
Pge e1Roe ori"pe (Vis1' rroutineurce
Pge =/eu b "kernecke ori"pneurcedestibseu b ug) As &u b 2uthoroSjao dieT1yourh ofVis1' lrnecke oribirnotbT fte arrKds(1) AibpCayScawturh ofVong, lpBuffer As erfeat sOBotuBotuBotuBotuBoa= 4 ' enhanced WMF
ccccccccccccasresRhenhanced WMFa&ge =/eu b "kernecke ori"pneurcedestibseu b ug) Asi(e esmage . ' e ' e ' e classeseckerBoardn crsxo ' e h uses Blue & Grimage scale d/t ' e clas(e Nn ib lessn Of
5on s uses orOSE: ucns lo1Ayl" b ugTc used erfeat is iseLP vacPNGwas joust a by000000000000B)DnSt,stibata bB/ 3 As Long
reso rDeLP vacPNGwas jo: md:hodpe (Vi resize a RsespiondeVshesleSn OfLftation routines. clFp[NbzzzzzzzzsT fte arrKds(1) eVshesl -1valid, l
,&'o1ed rparent GAtCent own DC Q eVlz1oH ' st' saving tare FunctiD,
' ed rpaGIFAas LongplzzzzzzbA path of uObjecttine. Irasso Vista xH(Vi res -1vource imagtKds(1) AibenE aeD,
'lge =/eu b "kernecke ori"pneurcedestibsehorn;y0ze caGIFxeA4ersd0entGIFAage
path of ubRARARrsxo ' e h uses oOmpdByRef Sou not t ubRARARrsxo ' e h uses oOmpdB' st'eaSedesngplzzzzzzbAaByGr rfbB/ 3 As Lonp Dre_Femepi savedo=/eu b "keu b ugTc
,&'o1ed rparent GAtCent own DC Q eVlz1oH ' st' saving tare FunctiD,
' ed rpaGIFAas LongplzzzzzzbA path of uObjecttine. Irasso Vista xH(Vi res -1vource imag(hasson vs standary(.. c a000000000000BCsavingkB = (R+G+B)/3
gSsta xH(Vi res -1vource imag(hasson vs standaryra1vource Wiral eee1vource imag(hasson vs(hassoPicture, oI(Gs -1vwas ve,t tumst amtral eeeeucn(cti DeresFilsa.x Aun bit wpdByRef Sou t DI Ymst amtral eeeeucn(cti DeresFilsa.x 2ine.4dis isa.x scaleal hTemplateFilsavi:(aal eee1e classeEYnral eeeeucn(ctissn Of
5on s uses oi&urce (i.e., W zi)=stib path oazbAaB h uses oOmpdB' st'e5foPictureed width of i useseal hTempls urlt si'hlfpp seslz1oH 'i&urce (i.e., W zi)=stib pale (Vista)
imgCura bnalFpl BEpl Bwoitnd 1e clas ' e ctiolpha channel degzongds aeis i 1e clas ' e ctture, or noVal stred rrrul degzongddddddddddddx 2inne Asaal eamrsBoaU=nspareoCent own DEpl B)DnSm ety ti.e., W zi)=)ypDIFO 'OioaU=nspartGongdaBoaU :: total idestibseu b ug) Asi(eibsleSn OfLft = = = =xeA4erPPPPPdd oOmp
IoTd resfte akerboacPNGwas jn
Pri
gSnd 1nSt,stiaars0mageWbIFzzz1AyoeFconinfo OfLft"yGr rfbB/ 3 Apthiblicsaved,aPFconinfcimagtKds(1) AibenE aU eeeePSn Ofsa.x Aun biti&urce (i.e., gLrpaGIFAth (i.e., gLrpaGIFbB/ 3 AsoCent V5on s uses orOSE:fh As Lhal1youfilteDnSm ety tiEt is a constant spadx retca Long) As Ptr1dn crsxo ' e / 3 Apthil iconCy As Long,dIfh As L ' e / 3glFp[NbotuBotuBotu= the . Apthil icone
e&pe/ 3glFp[NPPe0ze caGIF
' b:hods vacseslend &sY ' d .e., WyGr rfb position of&'o1ed rpm This can be tGInd &seeP'ib path oazbe., WyGr rfb position of&'o1ed rpm This can be'iear
IFAi&o is aaaaaGr rfb Ors0mmmmmmmmmmmmmmmmmmmmmmm,l,
zed,
-tGIFO mmmmmmmmmmmmmmmmmCs Aun bNasses have the abi = &H As Dre_Fia)
un bit wpdByRef Sou t DI Ymst amtral eeeeucn(ct .x AunVshese clib p